/**
 * 
 */
package org.salatec.tapestry4e.wizard;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.OutputStreamWriter;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;
import org.eclipse.wst.sse.core.utils.StringUtils;
import org.salatec.tapestry4e.TMLPlugin;
import org.salatec.tapestry4e.util.Logger;

/**
 * @author juanmi
 * 
 */
public class NewTMLWizard extends Wizard implements INewWizard {
	private NewTMLFileWizardPage fNewFilePage;
	private IStructuredSelection fSelection;
	private boolean fShouldOpenEditorOnFinish = true;
	private static final String TML_HEADER = "<t:container xmlns:t=\"http://tapestry.apache.org/schema/tapestry_5_0_0.xsd\">";
	private static final String TML_FOOT = "</t:container>";

	public void init(IWorkbench aWorkbench, IStructuredSelection aSelection) {
		fSelection = aSelection;
		setWindowTitle("New Tapestry Template");

	}

	public void addPages() {
		fNewFilePage = new NewTMLFileWizardPage(
				"TMLWizardNewFileCreationPage", new StructuredSelection(IDE.computeSelectedResources(fSelection))); //$NON-NLS-1$ 
		fNewFilePage.setTitle("Tapestry Template");
		fNewFilePage.setDescription("Create a New Tapestry Template");
		addPage(fNewFilePage);

		// fNewFileTemplatesPage = new NewJSPTemplatesWizardPage();
		// addPage(fNewFileTemplatesPage);
	}

	private String applyLineDelimiter(IFile file, String text) {
		String lineDelimiter = Platform
				.getPreferencesService()
				.getString(
						Platform.PI_RUNTIME,
						Platform.PREF_LINE_SEPARATOR,
						System.getProperty("line.separator"), new IScopeContext[] { new ProjectScope(file.getProject()), new InstanceScope() });//$NON-NLS-1$
		String convertedText = StringUtils.replace(text, "\r\n", "\n");
		convertedText = StringUtils.replace(convertedText, "\r", "\n");
		convertedText = StringUtils.replace(convertedText, "\n", lineDelimiter);
		return convertedText;
	}

	@Override
	public boolean performFinish() {
		boolean performedOK = false;
		// no file extension specified so add default extension
		String fileName = fNewFilePage.getFileName();
		if (fileName.lastIndexOf('.') == -1) {
			String newFileName = fNewFilePage.addDefaultExtension(fileName);
			fNewFilePage.setFileName(newFileName);
		}
		// create a new empty file
		IFile file = fNewFilePage.createNewFile();

		// if there was problem with creating file, it will be null, so make
		// sure to check
		if (file != null) {
			// put template contents into file
			String templateString = getTemplateString();
			if (templateString != null) {
				templateString = applyLineDelimiter(file, templateString);
				// determine the encoding for the new file
				Preferences preference = TMLPlugin.getDefault()
						.getPluginPreferences();
				String charSet = preference
						.getString(CommonEncodingPreferenceNames.OUTPUT_CODESET);

				try {
					ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
					OutputStreamWriter outputStreamWriter = null;
					if (charSet == null || charSet.trim().equals("")) { //$NON-NLS-1$
						// just use default encoding
						outputStreamWriter = new OutputStreamWriter(
								outputStream);
					} else {
						outputStreamWriter = new OutputStreamWriter(
								outputStream, charSet);
					}
					outputStreamWriter.write(templateString);
					outputStreamWriter.flush();
					outputStreamWriter.close();
					ByteArrayInputStream inputStream = new ByteArrayInputStream(
							outputStream.toByteArray());
					file.setContents(inputStream, true, false, null);
					inputStream.close();
				} catch (Exception e) {
					Logger.log(Logger.WARNING_DEBUG,
							"Could not create contents for new TML file", e); //$NON-NLS-1$
				}
			}

			// open the file in editor
			if (fShouldOpenEditorOnFinish)
				openEditor(file);

			// everything's fine
			performedOK = true;
		}
		return performedOK;

	}

	private String getTemplateString() {
		return TML_HEADER + "\n" + TML_FOOT;
	}

	private void openEditor(final IFile file) {
		if (file != null) {
			getShell().getDisplay().asyncExec(new Runnable() {
				public void run() {
					try {
						IWorkbenchPage page = PlatformUI.getWorkbench()
								.getActiveWorkbenchWindow().getActivePage();
						IDE.openEditor(page, file, true);
					} catch (PartInitException e) {
						Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
					}
				}
			});
		}
	}

}
